home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / perl5 / 5.8.7 / pod / perltrap.pod < prev    next >
Text File  |  2006-04-25  |  41KB  |  1,591 lines

  1. =head1 NAME
  2.  
  3. perltrap - Perl traps for the unwary
  4.  
  5. =head1 DESCRIPTION
  6.  
  7. The biggest trap of all is forgetting to C<use warnings> or use the B<-w>
  8. switch; see L<perllexwarn> and L<perlrun>. The second biggest trap is not
  9. making your entire program runnable under C<use strict>.  The third biggest
  10. trap is not reading the list of changes in this version of Perl; see
  11. L<perldelta>.
  12.  
  13. =head2 Awk Traps
  14.  
  15. Accustomed B<awk> users should take special note of the following:
  16.  
  17. =over 4
  18.  
  19. =item *
  20.  
  21. A Perl program executes only once, not once for each input line.  You can
  22. do an implicit loop with C<-n> or C<-p>.
  23.  
  24. =item *
  25.  
  26. The English module, loaded via
  27.  
  28.     use English;
  29.  
  30. allows you to refer to special variables (like C<$/>) with names (like
  31. $RS), as though they were in B<awk>; see L<perlvar> for details.
  32.  
  33. =item *
  34.  
  35. Semicolons are required after all simple statements in Perl (except
  36. at the end of a block).  Newline is not a statement delimiter.
  37.  
  38. =item *
  39.  
  40. Curly brackets are required on C<if>s and C<while>s.
  41.  
  42. =item *
  43.  
  44. Variables begin with "$", "@" or "%" in Perl.
  45.  
  46. =item *
  47.  
  48. Arrays index from 0.  Likewise string positions in substr() and
  49. index().
  50.  
  51. =item *
  52.  
  53. You have to decide whether your array has numeric or string indices.
  54.  
  55. =item *
  56.  
  57. Hash values do not spring into existence upon mere reference.
  58.  
  59. =item *
  60.  
  61. You have to decide whether you want to use string or numeric
  62. comparisons.
  63.  
  64. =item *
  65.  
  66. Reading an input line does not split it for you.  You get to split it
  67. to an array yourself.  And the split() operator has different
  68. arguments than B<awk>'s.
  69.  
  70. =item *
  71.  
  72. The current input line is normally in $_, not $0.  It generally does
  73. not have the newline stripped.  ($0 is the name of the program
  74. executed.)  See L<perlvar>.
  75.  
  76. =item *
  77.  
  78. $<I<digit>> does not refer to fields--it refers to substrings matched
  79. by the last match pattern.
  80.  
  81. =item *
  82.  
  83. The print() statement does not add field and record separators unless
  84. you set C<$,> and C<$\>.  You can set $OFS and $ORS if you're using
  85. the English module.
  86.  
  87. =item *
  88.  
  89. You must open your files before you print to them.
  90.  
  91. =item *
  92.  
  93. The range operator is "..", not comma.  The comma operator works as in
  94. C.
  95.  
  96. =item *
  97.  
  98. The match operator is "=~", not "~".  ("~" is the one's complement
  99. operator, as in C.)
  100.  
  101. =item *
  102.  
  103. The exponentiation operator is "**", not "^".  "^" is the XOR
  104. operator, as in C.  (You know, one could get the feeling that B<awk> is
  105. basically incompatible with C.)
  106.  
  107. =item *
  108.  
  109. The concatenation operator is ".", not the null string.  (Using the
  110. null string would render C</pat/ /pat/> unparsable, because the third slash
  111. would be interpreted as a division operator--the tokenizer is in fact
  112. slightly context sensitive for operators like "/", "?", and ">".
  113. And in fact, "." itself can be the beginning of a number.)
  114.  
  115. =item *
  116.  
  117. The C<next>, C<exit>, and C<continue> keywords work differently.
  118.  
  119. =item *
  120.  
  121.  
  122. The following variables work differently:
  123.  
  124.       Awk    Perl
  125.       ARGC    scalar @ARGV (compare with $#ARGV)
  126.       ARGV[0]    $0
  127.       FILENAME    $ARGV
  128.       FNR    $. - something
  129.       FS    (whatever you like)
  130.       NF    $#Fld, or some such
  131.       NR    $.
  132.       OFMT    $#
  133.       OFS    $,
  134.       ORS    $\
  135.       RLENGTH    length($&)
  136.       RS    $/
  137.       RSTART    length($`)
  138.       SUBSEP    $;
  139.  
  140. =item *
  141.  
  142. You cannot set $RS to a pattern, only a string.
  143.  
  144. =item *
  145.  
  146. When in doubt, run the B<awk> construct through B<a2p> and see what it
  147. gives you.
  148.  
  149. =back
  150.  
  151. =head2 C/C++ Traps
  152.  
  153. Cerebral C and C++ programmers should take note of the following:
  154.  
  155. =over 4
  156.  
  157. =item *
  158.  
  159. Curly brackets are required on C<if>'s and C<while>'s.
  160.  
  161. =item *
  162.  
  163. You must use C<elsif> rather than C<else if>.
  164.  
  165. =item *
  166.  
  167. The C<break> and C<continue> keywords from C become in Perl C<last>
  168. and C<next>, respectively.  Unlike in C, these do I<not> work within a
  169. C<do { } while> construct.  See L<perlsyn/"Loop Control">.
  170.  
  171. =item *
  172.  
  173. There's no switch statement.  (But it's easy to build one on the fly,
  174. see L<perlsyn/"Basic BLOCKs and Switch Statements">)
  175.  
  176. =item *
  177.  
  178. Variables begin with "$", "@" or "%" in Perl.
  179.  
  180. =item *
  181.  
  182. Comments begin with "#", not "/*" or "//".  Perl may interpret C/C++
  183. comments as division operators, unterminated regular expressions or
  184. the defined-or operator.
  185.  
  186. =item *
  187.  
  188. You can't take the address of anything, although a similar operator
  189. in Perl is the backslash, which creates a reference.
  190.  
  191. =item *
  192.  
  193. C<ARGV> must be capitalized.  C<$ARGV[0]> is C's C<argv[1]>, and C<argv[0]>
  194. ends up in C<$0>.
  195.  
  196. =item *
  197.  
  198. System calls such as link(), unlink(), rename(), etc. return nonzero for
  199. success, not 0. (system(), however, returns zero for success.)
  200.  
  201. =item *
  202.  
  203. Signal handlers deal with signal names, not numbers.  Use C<kill -l>
  204. to find their names on your system.
  205.  
  206. =back
  207.  
  208. =head2 Sed Traps
  209.  
  210. Seasoned B<sed> programmers should take note of the following:
  211.  
  212. =over 4
  213.  
  214. =item *
  215.  
  216. A Perl program executes only once, not once for each input line.  You can
  217. do an implicit loop with C<-n> or C<-p>.
  218.  
  219. =item *
  220.  
  221. Backreferences in substitutions use "$" rather than "\".
  222.  
  223. =item *
  224.  
  225. The pattern matching metacharacters "(", ")", and "|" do not have backslashes
  226. in front.
  227.  
  228. =item *
  229.  
  230. The range operator is C<...>, rather than comma.
  231.  
  232. =back
  233.  
  234. =head2 Shell Traps
  235.  
  236. Sharp shell programmers should take note of the following:
  237.  
  238. =over 4
  239.  
  240. =item *
  241.  
  242. The backtick operator does variable interpolation without regard to
  243. the presence of single quotes in the command.
  244.  
  245. =item *
  246.  
  247. The backtick operator does no translation of the return value, unlike B<csh>.
  248.  
  249. =item *
  250.  
  251. Shells (especially B<csh>) do several levels of substitution on each
  252. command line.  Perl does substitution in only certain constructs
  253. such as double quotes, backticks, angle brackets, and search patterns.
  254.  
  255. =item *
  256.  
  257. Shells interpret scripts a little bit at a time.  Perl compiles the
  258. entire program before executing it (except for C<BEGIN> blocks, which
  259. execute at compile time).
  260.  
  261. =item *
  262.  
  263. The arguments are available via @ARGV, not $1, $2, etc.
  264.  
  265. =item *
  266.  
  267. The environment is not automatically made available as separate scalar
  268. variables.
  269.  
  270. =item *
  271.  
  272. The shell's C<test> uses "=", "!=", "<" etc for string comparisons and "-eq",
  273. "-ne", "-lt" etc for numeric comparisons. This is the reverse of Perl, which
  274. uses C<eq>, C<ne>, C<lt> for string comparisons, and C<==>, C<!=> C<< < >> etc
  275. for numeric comparisons.
  276.  
  277. =back
  278.  
  279. =head2 Perl Traps
  280.  
  281. Practicing Perl Programmers should take note of the following:
  282.  
  283. =over 4
  284.  
  285. =item *
  286.  
  287. Remember that many operations behave differently in a list
  288. context than they do in a scalar one.  See L<perldata> for details.
  289.  
  290. =item *
  291.  
  292. Avoid barewords if you can, especially all lowercase ones.
  293. You can't tell by just looking at it whether a bareword is
  294. a function or a string.  By using quotes on strings and
  295. parentheses on function calls, you won't ever get them confused.
  296.  
  297. =item *
  298.  
  299. You cannot discern from mere inspection which builtins
  300. are unary operators (like chop() and chdir())
  301. and which are list operators (like print() and unlink()).
  302. (Unless prototyped, user-defined subroutines can B<only> be list
  303. operators, never unary ones.)  See L<perlop> and L<perlsub>.
  304.  
  305. =item *
  306.  
  307. People have a hard time remembering that some functions
  308. default to $_, or @ARGV, or whatever, but that others which
  309. you might expect to do not.
  310.  
  311. =item *
  312.  
  313. The <FH> construct is not the name of the filehandle, it is a readline
  314. operation on that handle.  The data read is assigned to $_ only if the
  315. file read is the sole condition in a while loop:
  316.  
  317.     while (<FH>)      { }
  318.     while (defined($_ = <FH>)) { }..
  319.     <FH>;  # data discarded!
  320.  
  321. =item *
  322.  
  323. Remember not to use C<=> when you need C<=~>;
  324. these two constructs are quite different:
  325.  
  326.     $x =  /foo/;
  327.     $x =~ /foo/;
  328.  
  329. =item *
  330.  
  331. The C<do {}> construct isn't a real loop that you can use
  332. loop control on.
  333.  
  334. =item *
  335.  
  336. Use C<my()> for local variables whenever you can get away with
  337. it (but see L<perlform> for where you can't).
  338. Using C<local()> actually gives a local value to a global
  339. variable, which leaves you open to unforeseen side-effects
  340. of dynamic scoping.
  341.  
  342. =item *
  343.  
  344. If you localize an exported variable in a module, its exported value will
  345. not change.  The local name becomes an alias to a new value but the
  346. external name is still an alias for the original.
  347.  
  348. =back
  349.  
  350. =head2 Perl4 to Perl5 Traps
  351.  
  352. Practicing Perl4 Programmers should take note of the following
  353. Perl4-to-Perl5 specific traps.
  354.  
  355. They're crudely ordered according to the following list:
  356.  
  357. =over 4
  358.  
  359. =item Discontinuance, Deprecation, and BugFix traps
  360.  
  361. Anything that's been fixed as a perl4 bug, removed as a perl4 feature
  362. or deprecated as a perl4 feature with the intent to encourage usage of
  363. some other perl5 feature.
  364.  
  365. =item Parsing Traps
  366.  
  367. Traps that appear to stem from the new parser.
  368.  
  369. =item Numerical Traps
  370.  
  371. Traps having to do with numerical or mathematical operators.
  372.  
  373. =item General data type traps
  374.  
  375. Traps involving perl standard data types.
  376.  
  377. =item Context Traps - scalar, list contexts
  378.  
  379. Traps related to context within lists, scalar statements/declarations.
  380.  
  381. =item Precedence Traps
  382.  
  383. Traps related to the precedence of parsing, evaluation, and execution of
  384. code.
  385.  
  386. =item General Regular Expression Traps using s///, etc.
  387.  
  388. Traps related to the use of pattern matching.
  389.  
  390. =item Subroutine, Signal, Sorting Traps
  391.  
  392. Traps related to the use of signals and signal handlers, general subroutines,
  393. and sorting, along with sorting subroutines.
  394.  
  395. =item OS Traps
  396.  
  397. OS-specific traps.
  398.  
  399. =item DBM Traps
  400.  
  401. Traps specific to the use of C<dbmopen()>, and specific dbm implementations.
  402.  
  403. =item Unclassified Traps
  404.  
  405. Everything else.
  406.  
  407. =back
  408.  
  409. If you find an example of a conversion trap that is not listed here,
  410. please submit it to <F<perlbug@perl.org>> for inclusion.
  411. Also note that at least some of these can be caught with the
  412. C<use warnings> pragma or the B<-w> switch.
  413.  
  414. =head2 Discontinuance, Deprecation, and BugFix traps
  415.  
  416. Anything that has been discontinued, deprecated, or fixed as
  417. a bug from perl4.
  418.  
  419. =over 4
  420.  
  421. =item * Symbols starting with "_" no longer forced into main
  422.  
  423. Symbols starting with "_" are no longer forced into package main, except
  424. for C<$_> itself (and C<@_>, etc.).
  425.  
  426.     package test;
  427.     $_legacy = 1;
  428.  
  429.     package main;
  430.     print "\$_legacy is ",$_legacy,"\n";
  431.  
  432.     # perl4 prints: $_legacy is 1
  433.     # perl5 prints: $_legacy is
  434.  
  435. =item * Double-colon valid package separator in variable name
  436.  
  437. Double-colon is now a valid package separator in a variable name.  Thus these
  438. behave differently in perl4 vs. perl5, because the packages don't exist.
  439.  
  440.     $a=1;$b=2;$c=3;$var=4;
  441.     print "$a::$b::$c ";
  442.     print "$var::abc::xyz\n";
  443.  
  444.     # perl4 prints: 1::2::3 4::abc::xyz
  445.     # perl5 prints: 3
  446.  
  447. Given that C<::> is now the preferred package delimiter, it is debatable
  448. whether this should be classed as a bug or not.
  449. (The older package delimiter, ' ,is used here)
  450.  
  451.     $x = 10 ;
  452.     print "x=${'x}\n" ;
  453.  
  454.     # perl4 prints: x=10
  455.     # perl5 prints: Can't find string terminator "'" anywhere before EOF
  456.  
  457. You can avoid this problem, and remain compatible with perl4, if you
  458. always explicitly include the package name:
  459.  
  460.     $x = 10 ;
  461.     print "x=${main'x}\n" ;
  462.  
  463. Also see precedence traps, for parsing C<$:>.
  464.  
  465. =item * 2nd and 3rd args to C<splice()> are now in scalar context
  466.  
  467. The second and third arguments of C<splice()> are now evaluated in scalar
  468. context (as the Camel says) rather than list context.
  469.  
  470.     sub sub1{return(0,2) }          # return a 2-element list
  471.     sub sub2{ return(1,2,3)}        # return a 3-element list
  472.     @a1 = ("a","b","c","d","e");
  473.     @a2 = splice(@a1,&sub1,&sub2);
  474.     print join(' ',@a2),"\n";
  475.  
  476.     # perl4 prints: a b
  477.     # perl5 prints: c d e
  478.  
  479. =item * Can't do C<goto> into a block that is optimized away
  480.  
  481. You can't do a C<goto> into a block that is optimized away.  Darn.
  482.  
  483.     goto marker1;
  484.  
  485.     for(1){
  486.     marker1:
  487.         print "Here I is!\n";
  488.     }
  489.  
  490.     # perl4 prints: Here I is!
  491.     # perl5 errors: Can't "goto" into the middle of a foreach loop
  492.  
  493. =item * Can't use whitespace as variable name or quote delimiter
  494.  
  495. It is no longer syntactically legal to use whitespace as the name
  496. of a variable, or as a delimiter for any kind of quote construct.
  497. Double darn.
  498.  
  499.     $a = ("foo bar");
  500.     $b = q baz ;
  501.     print "a is $a, b is $b\n";
  502.  
  503.     # perl4 prints: a is foo bar, b is baz
  504.     # perl5 errors: Bareword found where operator expected
  505.  
  506. =item * C<while/if BLOCK BLOCK> gone
  507.  
  508. The archaic while/if BLOCK BLOCK syntax is no longer supported.
  509.  
  510.     if { 1 } {
  511.         print "True!";
  512.     }
  513.     else {
  514.         print "False!";
  515.     }
  516.  
  517.     # perl4 prints: True!
  518.     # perl5 errors: syntax error at test.pl line 1, near "if {"
  519.  
  520. =item * C<**> binds tighter than unary minus
  521.  
  522. The C<**> operator now binds more tightly than unary minus.
  523. It was documented to work this way before, but didn't.
  524.  
  525.     print -4**2,"\n";
  526.  
  527.     # perl4 prints: 16
  528.     # perl5 prints: -16
  529.  
  530. =item * C<foreach> changed when iterating over a list
  531.  
  532. The meaning of C<foreach{}> has changed slightly when it is iterating over a
  533. list which is not an array.  This used to assign the list to a
  534. temporary array, but no longer does so (for efficiency).  This means
  535. that you'll now be iterating over the actual values, not over copies of
  536. the values.  Modifications to the loop variable can change the original
  537. values.
  538.  
  539.     @list = ('ab','abc','bcd','def');
  540.     foreach $var (grep(/ab/,@list)){
  541.         $var = 1;
  542.     }
  543.     print (join(':',@list));
  544.  
  545.     # perl4 prints: ab:abc:bcd:def
  546.     # perl5 prints: 1:1:bcd:def
  547.  
  548. To retain Perl4 semantics you need to assign your list
  549. explicitly to a temporary array and then iterate over that.  For
  550. example, you might need to change
  551.  
  552.     foreach $var (grep(/ab/,@list)){
  553.  
  554. to
  555.  
  556.     foreach $var (@tmp = grep(/ab/,@list)){
  557.  
  558. Otherwise changing $var will clobber the values of @list.  (This most often
  559. happens when you use C<$_> for the loop variable, and call subroutines in
  560. the loop that don't properly localize C<$_>.)
  561.  
  562. =item * C<split> with no args behavior changed
  563.  
  564. C<split> with no arguments now behaves like C<split ' '> (which doesn't
  565. return an initial null field if $_ starts with whitespace), it used to
  566. behave like C<split /\s+/> (which does).
  567.  
  568.     $_ = ' hi mom';
  569.     print join(':', split);
  570.  
  571.     # perl4 prints: :hi:mom
  572.     # perl5 prints: hi:mom
  573.  
  574. =item * B<-e> behavior fixed
  575.  
  576. Perl 4 would ignore any text which was attached to an B<-e> switch,
  577. always taking the code snippet from the following arg.  Additionally, it
  578. would silently accept an B<-e> switch without a following arg.  Both of
  579. these behaviors have been fixed.
  580.  
  581.     perl -e'print "attached to -e"' 'print "separate arg"'
  582.  
  583.     # perl4 prints: separate arg
  584.     # perl5 prints: attached to -e
  585.  
  586.     perl -e
  587.  
  588.     # perl4 prints:
  589.     # perl5 dies: No code specified for -e.
  590.  
  591. =item * C<push> returns number of elements in resulting list
  592.  
  593. In Perl 4 the return value of C<push> was undocumented, but it was
  594. actually the last value being pushed onto the target list.  In Perl 5
  595. the return value of C<push> is documented, but has changed, it is the
  596. number of elements in the resulting list.
  597.  
  598.     @x = ('existing');
  599.     print push(@x, 'first new', 'second new');
  600.  
  601.     # perl4 prints: second new
  602.     # perl5 prints: 3
  603.  
  604. =item * Some error messages differ
  605.  
  606. Some error messages will be different.
  607.  
  608. =item * C<split()> honors subroutine args
  609.  
  610. In Perl 4, if in list context the delimiters to the first argument of
  611. C<split()> were C<??>, the result would be placed in C<@_> as well as
  612. being returned.   Perl 5 has more respect for your subroutine arguments.
  613.  
  614. =item * Bugs removed
  615.  
  616. Some bugs may have been inadvertently removed.  :-)
  617.  
  618. =back
  619.  
  620. =head2 Parsing Traps
  621.  
  622. Perl4-to-Perl5 traps from having to do with parsing.
  623.  
  624. =over 4
  625.  
  626. =item * Space between . and = triggers syntax error
  627.  
  628. Note the space between . and =
  629.  
  630.     $string . = "more string";
  631.     print $string;
  632.  
  633.     # perl4 prints: more string
  634.     # perl5 prints: syntax error at - line 1, near ". ="
  635.  
  636. =item * Better parsing in perl 5
  637.  
  638. Better parsing in perl 5
  639.  
  640.     sub foo {}
  641.     &foo
  642.     print("hello, world\n");
  643.  
  644.     # perl4 prints: hello, world
  645.     # perl5 prints: syntax error
  646.  
  647. =item * Function parsing
  648.  
  649. "if it looks like a function, it is a function" rule.
  650.  
  651.   print
  652.     ($foo == 1) ? "is one\n" : "is zero\n";
  653.  
  654.     # perl4 prints: is zero
  655.     # perl5 warns: "Useless use of a constant in void context" if using -w
  656.  
  657. =item * String interpolation of C<$#array> differs
  658.  
  659. String interpolation of the C<$#array> construct differs when braces
  660. are to used around the name.
  661.  
  662.     @a = (1..3);
  663.     print "${#a}";
  664.  
  665.     # perl4 prints: 2
  666.     # perl5 fails with syntax error
  667.  
  668.     @ = (1..3);
  669.     print "$#{a}";
  670.  
  671.     # perl4 prints: {a}
  672.     # perl5 prints: 2
  673.  
  674. =item * Perl guesses on C<map>, C<grep> followed by C<{> if it starts BLOCK or hash ref
  675.  
  676. When perl sees C<map {> (or C<grep {>), it has to guess whether the C<{>
  677. starts a BLOCK or a hash reference. If it guesses wrong, it will report
  678. a syntax error near the C<}> and the missing (or unexpected) comma.
  679.  
  680. Use unary C<+> before C<{> on a hash reference, and unary C<+> applied
  681. to the first thing in a BLOCK (after C<{>), for perl to guess right all
  682. the time. (See L<perlfunc/map>.)
  683.  
  684. =back
  685.  
  686. =head2 Numerical Traps
  687.  
  688. Perl4-to-Perl5 traps having to do with numerical operators,
  689. operands, or output from same.
  690.  
  691. =over 5
  692.  
  693. =item * Formatted output and significant digits
  694.  
  695. Formatted output and significant digits.  In general, Perl 5
  696. tries to be more precise.  For example, on a Solaris Sparc:
  697.  
  698.     print 7.373504 - 0, "\n";
  699.     printf "%20.18f\n", 7.373504 - 0;
  700.  
  701.     # Perl4 prints:
  702.     7.3750399999999996141
  703.     7.375039999999999614
  704.  
  705.     # Perl5 prints:
  706.     7.373504
  707.     7.375039999999999614
  708.  
  709. Notice how the first result looks better in Perl 5.
  710.  
  711. Your results may vary, since your floating point formatting routines
  712. and even floating point format may be slightly different.
  713.  
  714. =item * Auto-increment operator over signed int limit deleted
  715.  
  716. This specific item has been deleted.  It demonstrated how the auto-increment
  717. operator would not catch when a number went over the signed int limit.  Fixed
  718. in version 5.003_04.  But always be wary when using large integers.
  719. If in doubt:
  720.  
  721.    use Math::BigInt;
  722.  
  723. =item * Assignment of return values from numeric equality tests doesn't work
  724.  
  725. Assignment of return values from numeric equality tests
  726. does not work in perl5 when the test evaluates to false (0).
  727. Logical tests now return a null, instead of 0
  728.  
  729.     $p = ($test == 1);
  730.     print $p,"\n";
  731.  
  732.     # perl4 prints: 0
  733.     # perl5 prints:
  734.  
  735. Also see L<"General Regular Expression Traps using s///, etc.">
  736. for another example of this new feature...
  737.  
  738. =item * Bitwise string ops
  739.  
  740. When bitwise operators which can operate upon either numbers or
  741. strings (C<& | ^ ~>) are given only strings as arguments, perl4 would
  742. treat the operands as bitstrings so long as the program contained a call
  743. to the C<vec()> function. perl5 treats the string operands as bitstrings.
  744. (See L<perlop/Bitwise String Operators> for more details.)
  745.  
  746.     $fred = "10";
  747.     $barney = "12";
  748.     $betty = $fred & $barney;
  749.     print "$betty\n";
  750.     # Uncomment the next line to change perl4's behavior
  751.     # ($dummy) = vec("dummy", 0, 0);
  752.  
  753.     # Perl4 prints:
  754.     8
  755.  
  756.     # Perl5 prints:
  757.     10
  758.  
  759.     # If vec() is used anywhere in the program, both print:
  760.     10
  761.  
  762. =back
  763.  
  764. =head2 General data type traps
  765.  
  766. Perl4-to-Perl5 traps involving most data-types, and their usage
  767. within certain expressions and/or context.
  768.  
  769. =over 5
  770.  
  771. =item * Negative array subscripts now count from the end of array
  772.  
  773. Negative array subscripts now count from the end of the array.
  774.  
  775.     @a = (1, 2, 3, 4, 5);
  776.     print "The third element of the array is $a[3] also expressed as $a[-2] \n";
  777.  
  778.     # perl4 prints: The third element of the array is 4 also expressed as
  779.     # perl5 prints: The third element of the array is 4 also expressed as 4
  780.  
  781. =item * Setting C<$#array> lower now discards array elements
  782.  
  783. Setting C<$#array> lower now discards array elements, and makes them
  784. impossible to recover.
  785.  
  786.     @a = (a,b,c,d,e);
  787.     print "Before: ",join('',@a);
  788.     $#a =1;
  789.     print ", After: ",join('',@a);
  790.     $#a =3;
  791.     print ", Recovered: ",join('',@a),"\n";
  792.  
  793.     # perl4 prints: Before: abcde, After: ab, Recovered: abcd
  794.     # perl5 prints: Before: abcde, After: ab, Recovered: ab
  795.  
  796. =item * Hashes get defined before use
  797.  
  798. Hashes get defined before use
  799.  
  800.     local($s,@a,%h);
  801.     die "scalar \$s defined" if defined($s);
  802.     die "array \@a defined" if defined(@a);
  803.     die "hash \%h defined" if defined(%h);
  804.  
  805.     # perl4 prints:
  806.     # perl5 dies: hash %h defined
  807.  
  808. Perl will now generate a warning when it sees defined(@a) and
  809. defined(%h).
  810.  
  811. =item * Glob assignment from localized variable to variable
  812.  
  813. glob assignment from variable to variable will fail if the assigned
  814. variable is localized subsequent to the assignment
  815.  
  816.     @a = ("This is Perl 4");
  817.     *b = *a;
  818.     local(@a);
  819.     print @b,"\n";
  820.  
  821.     # perl4 prints: This is Perl 4
  822.     # perl5 prints:
  823.  
  824. =item * Assigning C<undef> to glob
  825.  
  826. Assigning C<undef> to a glob has no effect in Perl 5.   In Perl 4
  827. it undefines the associated scalar (but may have other side effects
  828. including SEGVs). Perl 5 will also warn if C<undef> is assigned to a
  829. typeglob. (Note that assigning C<undef> to a typeglob is different
  830. than calling the C<undef> function on a typeglob (C<undef *foo>), which
  831. has quite a few effects.
  832.  
  833.     $foo = "bar";
  834.     *foo = undef;
  835.     print $foo;
  836.  
  837.     # perl4 prints:
  838.     # perl4 warns: "Use of uninitialized variable" if using -w
  839.     # perl5 prints: bar
  840.     # perl5 warns: "Undefined value assigned to typeglob" if using -w
  841.  
  842. =item * Changes in unary negation (of strings)
  843.  
  844. Changes in unary negation (of strings)
  845. This change effects both the return value and what it
  846. does to auto(magic)increment.
  847.  
  848.     $x = "aaa";
  849.     print ++$x," : ";
  850.     print -$x," : ";
  851.     print ++$x,"\n";
  852.  
  853.     # perl4 prints: aab : -0 : 1
  854.     # perl5 prints: aab : -aab : aac
  855.  
  856. =item * Modifying of constants prohibited
  857.  
  858. perl 4 lets you modify constants:
  859.  
  860.     $foo = "x";
  861.     &mod($foo);
  862.     for ($x = 0; $x < 3; $x++) {
  863.         &mod("a");
  864.     }
  865.     sub mod {
  866.         print "before: $_[0]";
  867.         $_[0] = "m";
  868.         print "  after: $_[0]\n";
  869.     }
  870.  
  871.     # perl4:
  872.     # before: x  after: m
  873.     # before: a  after: m
  874.     # before: m  after: m
  875.     # before: m  after: m
  876.  
  877.     # Perl5:
  878.     # before: x  after: m
  879.     # Modification of a read-only value attempted at foo.pl line 12.
  880.     # before: a
  881.  
  882. =item * C<defined $var> behavior changed
  883.  
  884. The behavior is slightly different for:
  885.  
  886.     print "$x", defined $x
  887.  
  888.     # perl 4: 1
  889.     # perl 5: <no output, $x is not called into existence>
  890.  
  891. =item * Variable Suicide
  892.  
  893. Variable suicide behavior is more consistent under Perl 5.
  894. Perl5 exhibits the same behavior for hashes and scalars,
  895. that perl4 exhibits for only scalars.
  896.  
  897.     $aGlobal{ "aKey" } = "global value";
  898.     print "MAIN:", $aGlobal{"aKey"}, "\n";
  899.     $GlobalLevel = 0;
  900.     &test( *aGlobal );
  901.  
  902.     sub test {
  903.         local( *theArgument ) = @_;
  904.         local( %aNewLocal ); # perl 4 != 5.001l,m
  905.         $aNewLocal{"aKey"} = "this should never appear";
  906.         print "SUB: ", $theArgument{"aKey"}, "\n";
  907.         $aNewLocal{"aKey"} = "level $GlobalLevel";   # what should print
  908.         $GlobalLevel++;
  909.         if( $GlobalLevel<4 ) {
  910.             &test( *aNewLocal );
  911.         }
  912.     }
  913.  
  914.     # Perl4:
  915.     # MAIN:global value
  916.     # SUB: global value
  917.     # SUB: level 0
  918.     # SUB: level 1
  919.     # SUB: level 2
  920.  
  921.     # Perl5:
  922.     # MAIN:global value
  923.     # SUB: global value
  924.     # SUB: this should never appear
  925.     # SUB: this should never appear
  926.     # SUB: this should never appear
  927.  
  928. =back
  929.  
  930. =head2 Context Traps - scalar, list contexts
  931.  
  932. =over 5
  933.  
  934. =item * Elements of argument lists for formats evaluated in list context
  935.  
  936. The elements of argument lists for formats are now evaluated in list
  937. context.  This means you can interpolate list values now.
  938.  
  939.     @fmt = ("foo","bar","baz");
  940.     format STDOUT=
  941.     @<<<<< @||||| @>>>>>
  942.     @fmt;
  943.     .
  944.     write;
  945.  
  946.     # perl4 errors:  Please use commas to separate fields in file
  947.     # perl5 prints: foo     bar      baz
  948.  
  949. =item * C<caller()> returns false value in scalar context if no caller present
  950.  
  951. The C<caller()> function now returns a false value in a scalar context
  952. if there is no caller.  This lets library files determine if they're
  953. being required.
  954.  
  955.     caller() ? (print "You rang?\n") : (print "Got a 0\n");
  956.  
  957.     # perl4 errors: There is no caller
  958.     # perl5 prints: Got a 0
  959.  
  960. =item * Comma operator in scalar context gives scalar context to args
  961.  
  962. The comma operator in a scalar context is now guaranteed to give a
  963. scalar context to its arguments.
  964.  
  965.     @y= ('a','b','c');
  966.     $x = (1, 2, @y);
  967.     print "x = $x\n";
  968.  
  969.     # Perl4 prints:  x = c   # Thinks list context interpolates list
  970.     # Perl5 prints:  x = 3   # Knows scalar uses length of list
  971.  
  972. =item * C<sprintf()> prototyped as C<($;@)>
  973.  
  974. C<sprintf()> is prototyped as ($;@), so its first argument is given scalar
  975. context. Thus, if passed an array, it will probably not do what you want,
  976. unlike Perl 4:
  977.  
  978.     @z = ('%s%s', 'foo', 'bar');
  979.     $x = sprintf(@z);
  980.     print $x;
  981.  
  982.     # perl4 prints: foobar
  983.     # perl5 prints: 3
  984.  
  985. C<printf()> works the same as it did in Perl 4, though:
  986.  
  987.     @z = ('%s%s', 'foo', 'bar');
  988.     printf STDOUT (@z);
  989.  
  990.     # perl4 prints: foobar
  991.     # perl5 prints: foobar
  992.  
  993. =back
  994.  
  995. =head2 Precedence Traps
  996.  
  997. Perl4-to-Perl5 traps involving precedence order.
  998.  
  999. Perl 4 has almost the same precedence rules as Perl 5 for the operators
  1000. that they both have.  Perl 4 however, seems to have had some
  1001. inconsistencies that made the behavior differ from what was documented.
  1002.  
  1003. =over 5
  1004.  
  1005. =item * LHS vs. RHS of any assignment operator
  1006.  
  1007. LHS vs. RHS of any assignment operator.  LHS is evaluated first
  1008. in perl4, second in perl5; this can affect the relationship
  1009. between side-effects in sub-expressions.
  1010.  
  1011.     @arr = ( 'left', 'right' );
  1012.     $a{shift @arr} = shift @arr;
  1013.     print join( ' ', keys %a );
  1014.  
  1015.     # perl4 prints: left
  1016.     # perl5 prints: right
  1017.  
  1018. =item * Semantic errors introduced due to precedence
  1019.  
  1020. These are now semantic errors because of precedence:
  1021.  
  1022.     @list = (1,2,3,4,5);
  1023.     %map = ("a",1,"b",2,"c",3,"d",4);
  1024.     $n = shift @list + 2;   # first item in list plus 2
  1025.     print "n is $n, ";
  1026.     $m = keys %map + 2;     # number of items in hash plus 2
  1027.     print "m is $m\n";
  1028.  
  1029.     # perl4 prints: n is 3, m is 6
  1030.     # perl5 errors and fails to compile
  1031.  
  1032. =item * Precedence of assignment operators same as the precedence of assignment
  1033.  
  1034. The precedence of assignment operators is now the same as the precedence
  1035. of assignment.  Perl 4 mistakenly gave them the precedence of the associated
  1036. operator.  So you now must parenthesize them in expressions like
  1037.  
  1038.     /foo/ ? ($a += 2) : ($a -= 2);
  1039.  
  1040. Otherwise
  1041.  
  1042.     /foo/ ? $a += 2 : $a -= 2
  1043.  
  1044. would be erroneously parsed as
  1045.  
  1046.     (/foo/ ? $a += 2 : $a) -= 2;
  1047.  
  1048. On the other hand,
  1049.  
  1050.     $a += /foo/ ? 1 : 2;
  1051.  
  1052. now works as a C programmer would expect.
  1053.  
  1054. =item * C<open> requires parentheses around filehandle
  1055.  
  1056.     open FOO || die;
  1057.  
  1058. is now incorrect.  You need parentheses around the filehandle.
  1059. Otherwise, perl5 leaves the statement as its default precedence:
  1060.  
  1061.     open(FOO || die);
  1062.  
  1063.     # perl4 opens or dies
  1064.     # perl5 opens FOO, dying only if 'FOO' is false, i.e. never
  1065.  
  1066. =item * C<$:> precedence over C<$::> gone
  1067.  
  1068. perl4 gives the special variable, C<$:> precedence, where perl5
  1069. treats C<$::> as main C<package>
  1070.  
  1071.     $a = "x"; print "$::a";
  1072.  
  1073.     # perl 4 prints: -:a
  1074.     # perl 5 prints: x
  1075.  
  1076. =item * Precedence of file test operators documented
  1077.  
  1078. perl4 had buggy precedence for the file test operators vis-a-vis
  1079. the assignment operators.  Thus, although the precedence table
  1080. for perl4 leads one to believe C<-e $foo .= "q"> should parse as
  1081. C<((-e $foo) .= "q")>, it actually parses as C<(-e ($foo .= "q"))>.
  1082. In perl5, the precedence is as documented.
  1083.  
  1084.     -e $foo .= "q"
  1085.  
  1086.     # perl4 prints: no output
  1087.     # perl5 prints: Can't modify -e in concatenation
  1088.  
  1089. =item * C<keys>, C<each>, C<values> are regular named unary operators
  1090.  
  1091. In perl4, keys(), each() and values() were special high-precedence operators
  1092. that operated on a single hash, but in perl5, they are regular named unary
  1093. operators.  As documented, named unary operators have lower precedence
  1094. than the arithmetic and concatenation operators C<+ - .>, but the perl4
  1095. variants of these operators actually bind tighter than C<+ - .>.
  1096. Thus, for:
  1097.  
  1098.     %foo = 1..10;
  1099.     print keys %foo - 1
  1100.  
  1101.     # perl4 prints: 4
  1102.     # perl5 prints: Type of arg 1 to keys must be hash (not subtraction)
  1103.  
  1104. The perl4 behavior was probably more useful, if less consistent.
  1105.  
  1106. =back
  1107.  
  1108. =head2 General Regular Expression Traps using s///, etc.
  1109.  
  1110. All types of RE traps.
  1111.  
  1112. =over 5
  1113.  
  1114. =item * C<s'$lhs'$rhs'> interpolates on either side
  1115.  
  1116. C<s'$lhs'$rhs'> now does no interpolation on either side.  It used to
  1117. interpolate $lhs but not $rhs.  (And still does not match a literal
  1118. '$' in string)
  1119.  
  1120.     $a=1;$b=2;
  1121.     $string = '1 2 $a $b';
  1122.     $string =~ s'$a'$b';
  1123.     print $string,"\n";
  1124.  
  1125.     # perl4 prints: $b 2 $a $b
  1126.     # perl5 prints: 1 2 $a $b
  1127.  
  1128. =item * C<m//g> attaches its state to the searched string
  1129.  
  1130. C<m//g> now attaches its state to the searched string rather than the
  1131. regular expression.  (Once the scope of a block is left for the sub, the
  1132. state of the searched string is lost)
  1133.  
  1134.     $_ = "ababab";
  1135.     while(m/ab/g){
  1136.         &doit("blah");
  1137.     }
  1138.     sub doit{local($_) = shift; print "Got $_ "}
  1139.  
  1140.     # perl4 prints: Got blah Got blah Got blah Got blah
  1141.     # perl5 prints: infinite loop blah...
  1142.  
  1143. =item * C<m//o> used within an anonymous sub
  1144.  
  1145. Currently, if you use the C<m//o> qualifier on a regular expression
  1146. within an anonymous sub, I<all> closures generated from that anonymous
  1147. sub will use the regular expression as it was compiled when it was used
  1148. the very first time in any such closure.  For instance, if you say
  1149.  
  1150.     sub build_match {
  1151.         my($left,$right) = @_;
  1152.         return sub { $_[0] =~ /$left stuff $right/o; };
  1153.     }
  1154.     $good = build_match('foo','bar');
  1155.     $bad = build_match('baz','blarch');
  1156.     print $good->('foo stuff bar') ? "ok\n" : "not ok\n";
  1157.     print $bad->('baz stuff blarch') ? "ok\n" : "not ok\n";
  1158.     print $bad->('foo stuff bar') ? "not ok\n" : "ok\n";
  1159.  
  1160. For most builds of Perl5, this will print:
  1161. ok
  1162. not ok
  1163. not ok
  1164.  
  1165. build_match() will always return a sub which matches the contents of
  1166. $left and $right as they were the I<first> time that build_match()
  1167. was called, not as they are in the current call.
  1168.  
  1169. =item * C<$+> isn't set to whole match
  1170.  
  1171. If no parentheses are used in a match, Perl4 sets C<$+> to
  1172. the whole match, just like C<$&>. Perl5 does not.
  1173.  
  1174.     "abcdef" =~ /b.*e/;
  1175.     print "\$+ = $+\n";
  1176.  
  1177.     # perl4 prints: bcde
  1178.     # perl5 prints:
  1179.  
  1180. =item * Substitution now returns null string if it fails
  1181.  
  1182. substitution now returns the null string if it fails
  1183.  
  1184.     $string = "test";
  1185.     $value = ($string =~ s/foo//);
  1186.     print $value, "\n";
  1187.  
  1188.     # perl4 prints: 0
  1189.     # perl5 prints:
  1190.  
  1191. Also see L<Numerical Traps> for another example of this new feature.
  1192.  
  1193. =item * C<s`lhs`rhs`> is now a normal substitution
  1194.  
  1195. C<s`lhs`rhs`> (using backticks) is now a normal substitution, with no
  1196. backtick expansion
  1197.  
  1198.     $string = "";
  1199.     $string =~ s`^`hostname`;
  1200.     print $string, "\n";
  1201.  
  1202.     # perl4 prints: <the local hostname>
  1203.     # perl5 prints: hostname
  1204.  
  1205. =item * Stricter parsing of variables in regular expressions
  1206.  
  1207. Stricter parsing of variables used in regular expressions
  1208.  
  1209.     s/^([^$grpc]*$grpc[$opt$plus$rep]?)//o;
  1210.  
  1211.     # perl4: compiles w/o error
  1212.     # perl5: with Scalar found where operator expected ..., near "$opt$plus"
  1213.  
  1214. an added component of this example, apparently from the same script, is
  1215. the actual value of the s'd string after the substitution.
  1216. C<[$opt]> is a character class in perl4 and an array subscript in perl5
  1217.  
  1218.     $grpc = 'a';
  1219.     $opt  = 'r';
  1220.     $_ = 'bar';
  1221.     s/^([^$grpc]*$grpc[$opt]?)/foo/;
  1222.     print ;
  1223.  
  1224.     # perl4 prints: foo
  1225.     # perl5 prints: foobar
  1226.  
  1227. =item * C<m?x?> matches only once
  1228.  
  1229. Under perl5, C<m?x?> matches only once, like C<?x?>. Under perl4, it matched
  1230. repeatedly, like C</x/> or C<m!x!>.
  1231.  
  1232.     $test = "once";
  1233.     sub match { $test =~ m?once?; }
  1234.     &match();
  1235.     if( &match() ) {
  1236.         # m?x? matches more then once
  1237.         print "perl4\n";
  1238.     } else {
  1239.         # m?x? matches only once
  1240.         print "perl5\n";
  1241.     }
  1242.  
  1243.     # perl4 prints: perl4
  1244.     # perl5 prints: perl5
  1245.  
  1246. =item * Failed matches don't reset the match variables
  1247.  
  1248. Unlike in Ruby, failed matches in Perl do not reset the match variables
  1249. ($1, $2, ..., C<$`>, ...).
  1250.  
  1251. =back
  1252.  
  1253. =head2 Subroutine, Signal, Sorting Traps
  1254.  
  1255. The general group of Perl4-to-Perl5 traps having to do with
  1256. Signals, Sorting, and their related subroutines, as well as
  1257. general subroutine traps.  Includes some OS-Specific traps.
  1258.  
  1259. =over 5
  1260.  
  1261. =item * Barewords that used to look like strings look like subroutine calls
  1262.  
  1263. Barewords that used to look like strings to Perl will now look like subroutine
  1264. calls if a subroutine by that name is defined before the compiler sees them.
  1265.  
  1266.     sub SeeYa { warn"Hasta la vista, baby!" }
  1267.     $SIG{'TERM'} = SeeYa;
  1268.     print "SIGTERM is now $SIG{'TERM'}\n";
  1269.  
  1270.     # perl4 prints: SIGTERM is now main'SeeYa
  1271.     # perl5 prints: SIGTERM is now main::1 (and warns "Hasta la vista, baby!")
  1272.  
  1273. Use B<-w> to catch this one
  1274.  
  1275. =item * Reverse is no longer allowed as the name of a sort subroutine
  1276.  
  1277. reverse is no longer allowed as the name of a sort subroutine.
  1278.  
  1279.     sub reverse{ print "yup "; $a <=> $b }
  1280.     print sort reverse (2,1,3);
  1281.  
  1282.     # perl4 prints: yup yup 123
  1283.     # perl5 prints: 123
  1284.     # perl5 warns (if using -w): Ambiguous call resolved as CORE::reverse()
  1285.  
  1286. =item * C<warn()> won't let you specify a filehandle.
  1287.  
  1288. Although it _always_ printed to STDERR, warn() would let you specify a
  1289. filehandle in perl4.  With perl5 it does not.
  1290.  
  1291.     warn STDERR "Foo!";
  1292.  
  1293.     # perl4 prints: Foo!
  1294.     # perl5 prints: String found where operator expected
  1295.  
  1296. =back
  1297.  
  1298. =head2 OS Traps
  1299.  
  1300. =over 5
  1301.  
  1302. =item * SysV resets signal handler correctly
  1303.  
  1304. Under HPUX, and some other SysV OSes, one had to reset any signal handler,
  1305. within  the signal handler function, each time a signal was handled with
  1306. perl4.  With perl5, the reset is now done correctly.  Any code relying
  1307. on the handler _not_ being reset will have to be reworked.
  1308.  
  1309. Since version 5.002, Perl uses sigaction() under SysV.
  1310.  
  1311.     sub gotit {
  1312.         print "Got @_... ";
  1313.     }
  1314.     $SIG{'INT'} = 'gotit';
  1315.  
  1316.     $| = 1;
  1317.     $pid = fork;
  1318.     if ($pid) {
  1319.         kill('INT', $pid);
  1320.         sleep(1);
  1321.         kill('INT', $pid);
  1322.     } else {
  1323.         while (1) {sleep(10);}
  1324.     }
  1325.  
  1326.     # perl4 (HPUX) prints: Got INT...
  1327.     # perl5 (HPUX) prints: Got INT... Got INT...
  1328.  
  1329. =item * SysV C<seek()> appends correctly
  1330.  
  1331. Under SysV OSes, C<seek()> on a file opened to append C<<< >> >>> now does
  1332. the right thing w.r.t. the fopen() manpage. e.g., - When a file is opened
  1333. for append,  it  is  impossible to overwrite information already in
  1334. the file.
  1335.  
  1336.     open(TEST,">>seek.test");
  1337.     $start = tell TEST ;
  1338.     foreach(1 .. 9){
  1339.         print TEST "$_ ";
  1340.     }
  1341.     $end = tell TEST ;
  1342.     seek(TEST,$start,0);
  1343.     print TEST "18 characters here";
  1344.  
  1345.     # perl4 (solaris) seek.test has: 18 characters here
  1346.     # perl5 (solaris) seek.test has: 1 2 3 4 5 6 7 8 9 18 characters here
  1347.  
  1348.  
  1349.  
  1350. =back
  1351.  
  1352. =head2 Interpolation Traps
  1353.  
  1354. Perl4-to-Perl5 traps having to do with how things get interpolated
  1355. within certain expressions, statements, contexts, or whatever.
  1356.  
  1357. =over 5
  1358.  
  1359. =item * C<@> always interpolates an array in double-quotish strings
  1360.  
  1361. @ now always interpolates an array in double-quotish strings.
  1362.  
  1363.     print "To: someone@somewhere.com\n";
  1364.  
  1365.     # perl4 prints: To:someone@somewhere.com
  1366.     # perl < 5.6.1, error : In string, @somewhere now must be written as \@somewhere
  1367.     # perl >= 5.6.1, warning : Possible unintended interpolation of @somewhere in string
  1368.  
  1369. =item * Double-quoted strings may no longer end with an unescaped $
  1370.  
  1371. Double-quoted strings may no longer end with an unescaped $.
  1372.  
  1373.     $foo = "foo$";
  1374.     print "foo is $foo\n";
  1375.  
  1376.     # perl4 prints: foo is foo$
  1377.     # perl5 errors: Final $ should be \$ or $name
  1378.  
  1379. Note: perl5 DOES NOT error on the terminating @ in $bar
  1380.  
  1381. =item * Arbitrary expressions are evaluated inside braces within double quotes
  1382.  
  1383. Perl now sometimes evaluates arbitrary expressions inside braces that occur
  1384. within double quotes (usually when the opening brace is preceded by C<$>
  1385. or C<@>).
  1386.  
  1387.     @www = "buz";
  1388.     $foo = "foo";
  1389.     $bar = "bar";
  1390.     sub foo { return "bar" };
  1391.     print "|@{w.w.w}|${main'foo}|";
  1392.  
  1393.     # perl4 prints: |@{w.w.w}|foo|
  1394.     # perl5 prints: |buz|bar|
  1395.  
  1396. Note that you can C<use strict;> to ward off such trappiness under perl5.
  1397.  
  1398. =item * C<$$x> now tries to dereference $x
  1399.  
  1400. The construct "this is $$x" used to interpolate the pid at that point, but
  1401. now tries to dereference $x.  C<$$> by itself still works fine, however.
  1402.  
  1403.     $s = "a reference";
  1404.     $x = *s;
  1405.     print "this is $$x\n";
  1406.  
  1407.     # perl4 prints: this is XXXx   (XXX is the current pid)
  1408.     # perl5 prints: this is a reference
  1409.  
  1410. =item * Creation of hashes on the fly with C<eval "EXPR"> requires protection
  1411.  
  1412. Creation of hashes on the fly with C<eval "EXPR"> now requires either both
  1413. C<$>'s to be protected in the specification of the hash name, or both curlies
  1414. to be protected.  If both curlies are protected, the result will be compatible
  1415. with perl4 and perl5.  This is a very common practice, and should be changed
  1416. to use the block form of C<eval{}>  if possible.
  1417.  
  1418.     $hashname = "foobar";
  1419.     $key = "baz";
  1420.     $value = 1234;
  1421.     eval "\$$hashname{'$key'} = q|$value|";
  1422.     (defined($foobar{'baz'})) ?  (print "Yup") : (print "Nope");
  1423.  
  1424.     # perl4 prints: Yup
  1425.     # perl5 prints: Nope
  1426.  
  1427. Changing
  1428.  
  1429.     eval "\$$hashname{'$key'} = q|$value|";
  1430.  
  1431. to
  1432.  
  1433.     eval "\$\$hashname{'$key'} = q|$value|";
  1434.  
  1435. causes the following result:
  1436.  
  1437.     # perl4 prints: Nope
  1438.     # perl5 prints: Yup
  1439.  
  1440. or, changing to
  1441.  
  1442.     eval "\$$hashname\{'$key'\} = q|$value|";
  1443.  
  1444. causes the following result:
  1445.  
  1446.     # perl4 prints: Yup
  1447.     # perl5 prints: Yup
  1448.     # and is compatible for both versions
  1449.  
  1450.  
  1451. =item * Bugs in earlier perl versions
  1452.  
  1453. perl4 programs which unconsciously rely on the bugs in earlier perl versions.
  1454.  
  1455.     perl -e '$bar=q/not/; print "This is $foo{$bar} perl5"'
  1456.  
  1457.     # perl4 prints: This is not perl5
  1458.     # perl5 prints: This is perl5
  1459.  
  1460. =item * Array and hash brackets during interpolation
  1461.  
  1462. You also have to be careful about array and hash brackets during
  1463. interpolation.
  1464.  
  1465.     print "$foo["
  1466.  
  1467.     perl 4 prints: [
  1468.     perl 5 prints: syntax error
  1469.  
  1470.     print "$foo{"
  1471.  
  1472.     perl 4 prints: {
  1473.     perl 5 prints: syntax error
  1474.  
  1475. Perl 5 is expecting to find an index or key name following the respective
  1476. brackets, as well as an ending bracket of the appropriate type.  In order
  1477. to mimic the behavior of Perl 4, you must escape the bracket like so.
  1478.  
  1479.     print "$foo\[";
  1480.     print "$foo\{";
  1481.  
  1482. =item * Interpolation of C<\$$foo{bar}>
  1483.  
  1484. Similarly, watch out for: C<\$$foo{bar}>
  1485.  
  1486.     $foo = "baz";
  1487.     print "\$$foo{bar}\n";
  1488.  
  1489.     # perl4 prints: $baz{bar}
  1490.     # perl5 prints: $
  1491.  
  1492. Perl 5 is looking for C<$foo{bar}> which doesn't exist, but perl 4 is
  1493. happy just to expand $foo to "baz" by itself.  Watch out for this
  1494. especially in C<eval>'s.
  1495.  
  1496. =item * C<qq()> string passed to C<eval> will not find string terminator
  1497.  
  1498. C<qq()> string passed to C<eval>
  1499.  
  1500.     eval qq(
  1501.         foreach \$y (keys %\$x\) {
  1502.             \$count++;
  1503.         }
  1504.     );
  1505.  
  1506.     # perl4 runs this ok
  1507.     # perl5 prints: Can't find string terminator ")"
  1508.  
  1509. =back
  1510.  
  1511. =head2 DBM Traps
  1512.  
  1513. General DBM traps.
  1514.  
  1515. =over 5
  1516.  
  1517. =item * Perl5 must have been linked with same dbm/ndbm as the default for C<dbmopen()>
  1518.  
  1519. Existing dbm databases created under perl4 (or any other dbm/ndbm tool)
  1520. may cause the same script, run under perl5, to fail.  The build of perl5
  1521. must have been linked with the same dbm/ndbm as the default for C<dbmopen()>
  1522. to function properly without C<tie>'ing to an extension dbm implementation.
  1523.  
  1524.     dbmopen (%dbm, "file", undef);
  1525.     print "ok\n";
  1526.  
  1527.     # perl4 prints: ok
  1528.     # perl5 prints: ok (IFF linked with -ldbm or -lndbm)
  1529.  
  1530.  
  1531. =item * DBM exceeding limit on the key/value size will cause perl5 to exit immediately
  1532.  
  1533. Existing dbm databases created under perl4 (or any other dbm/ndbm tool)
  1534. may cause the same script, run under perl5, to fail.  The error generated
  1535. when exceeding the limit on the key/value size will cause perl5 to exit
  1536. immediately.
  1537.  
  1538.     dbmopen(DB, "testdb",0600) || die "couldn't open db! $!";
  1539.     $DB{'trap'} = "x" x 1024;  # value too large for most dbm/ndbm
  1540.     print "YUP\n";
  1541.  
  1542.     # perl4 prints:
  1543.     dbm store returned -1, errno 28, key "trap" at - line 3.
  1544.     YUP
  1545.  
  1546.     # perl5 prints:
  1547.     dbm store returned -1, errno 28, key "trap" at - line 3.
  1548.  
  1549. =back
  1550.  
  1551. =head2 Unclassified Traps
  1552.  
  1553. Everything else.
  1554.  
  1555. =over 5
  1556.  
  1557. =item * C<require>/C<do> trap using returned value
  1558.  
  1559. If the file doit.pl has:
  1560.  
  1561.     sub foo {
  1562.         $rc = do "./do.pl";
  1563.         return 8;
  1564.     }
  1565.     print &foo, "\n";
  1566.  
  1567. And the do.pl file has the following single line:
  1568.  
  1569.     return 3;
  1570.  
  1571. Running doit.pl gives the following:
  1572.  
  1573.     # perl 4 prints: 3 (aborts the subroutine early)
  1574.     # perl 5 prints: 8
  1575.  
  1576. Same behavior if you replace C<do> with C<require>.
  1577.  
  1578. =item * C<split> on empty string with LIMIT specified
  1579.  
  1580.     $string = '';
  1581.     @list = split(/foo/, $string, 2)
  1582.  
  1583. Perl4 returns a one element list containing the empty string but Perl5
  1584. returns an empty list.
  1585.  
  1586. =back
  1587.  
  1588. As always, if any of these are ever officially declared as bugs,
  1589. they'll be fixed and removed.
  1590.  
  1591.